diff --git a/system/libraries/Router.php b/system/libraries/Router.php
index 6af6ad3..6fca452 100644
--- a/system/libraries/Router.php
+++ b/system/libraries/Router.php
@@ -28,10 +28,7 @@
  */
 class CI_Router {
 
-	var $config;
-	var $uri_string		= '';
-	var $segments		= array();
-	var $rsegments		= array();
+	var $config;	
 	var $routes 		= array();
 	var $error_routes	= array();
 	var $class			= '';
@@ -49,7 +46,8 @@
 	function CI_Router()
 	{
 		$this->config =& load_class('Config');
-		$this->_set_route_mapping();
+		$this->uri =& load_class('URI');
+		$this->_set_routing();
 		log_message('debug', "Router Class Initialized");
 	}
 	
@@ -64,17 +62,17 @@
 	 * @access	private
 	 * @return	void
 	 */
-	function _set_route_mapping()
+	function _set_routing()
 	{		
 		// Are query strings enabled in the config file?
 		// If so, we're done since segment based URIs are not used with query strings.
 		if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')]))
 		{
-			$this->set_class(trim($this->_filter_uri($_GET[$this->config->item('controller_trigger')])));
+			$this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')])));
 
 			if (isset($_GET[$this->config->item('function_trigger')]))
 			{
-				$this->set_method(trim($this->_filter_uri($_GET[$this->config->item('function_trigger')])));
+				$this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')])));
 			}
 			
 			return;
@@ -90,16 +88,10 @@
 		$this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') ? FALSE : strtolower($this->routes['default_controller']);	
 		
 		// Fetch the complete URI string
-		$this->uri_string = $this->_get_uri_string();
-		
-		// If the URI contains only a slash we'll kill it
-		if ($this->uri_string == '/')
-		{
-			$this->uri_string = '';
-		}
+		$this->uri->_fetch_uri_string();
 	
 		// Is there a URI string? If not, the default controller specified in the "routes" file will be shown.
-		if ($this->uri_string == '')
+		if ($this->uri->uri_string == '')
 		{
 			if ($this->default_controller === FALSE)
 			{
@@ -114,47 +106,35 @@
 		}
 		unset($this->routes['default_controller']);
 		
-		// Do we need to remove the suffix specified in the config file?
-		if  ($this->config->item('url_suffix') != "")
-		{
-			$this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string);
-		}
+		// Do we need to remove the URL suffix?
+		$this->uri->_remove_url_suffix();
 		
-		// Explode the URI Segments. The individual segments will
-		// be stored in the $this->segments array.	
-		foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
-		{
-			// Filter segments for security
-			$val = trim($this->_filter_uri($val));
-			
-			if ($val != '')
-				$this->segments[] = $val;
-		}
+		// Compile the segments into an array
+		$this->uri->_explode_segments();
 		
 		// Parse any custom routing that may exist
 		$this->_parse_routes();		
 		
 		// Re-index the segment array so that it starts with 1 rather than 0
-		$this->_reindex_segments();
+		$this->uri->_reindex_segments();
 	}
 	
 	// --------------------------------------------------------------------
 	
 	/**
-	 * Compile Segments
+	 * Set the Route
 	 *
 	 * This function takes an array of URI segments as
-	 * input, and puts it into the $this->segments array.
-	 * It also sets the current class/method
+	 * input, and sets the current class/method
 	 *
 	 * @access	private
 	 * @param	array
 	 * @param	bool
 	 * @return	void
 	 */
-	function _compile_segments($segments = array())
+	function _set_request($segments = array())
 	{	
-		$segments = $this->_validate_segments($segments);
+		$segments = $this->_validate_request($segments);
 		
 		if (count($segments) == 0)
 		{
@@ -180,8 +160,8 @@
 		
 		// Update our "routed" segment array to contain the segments.
 		// Note: If there is no custom routing, this array will be
-		// identical to $this->segments
-		$this->rsegments = $segments;
+		// identical to $this->uri->segments
+		$this->uri->rsegments = $segments;
 	}
 	
 	// --------------------------------------------------------------------
@@ -194,7 +174,7 @@
 	 * @param	array
 	 * @return	array
 	 */	
-	function _validate_segments($segments)
+	function _validate_request($segments)
 	{
 		// Does the requested controller exist in the root folder?
 		if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
@@ -237,182 +217,7 @@
 		// Can't find the requested controller...
 		show_404();	
 	}
-
-	// --------------------------------------------------------------------	
-	/**
-	 * Re-index Segments
-	 *
-	 * This function re-indexes the $this->segment array so that it
-	 * starts at 1 rather then 0.  Doing so makes it simpler to
-	 * use functions like $this->uri->segment(n) since there is
-	 * a 1:1 relationship between the segment array and the actual segments.
-	 *
-	 * @access	private
-	 * @return	void
-	 */	
-	function _reindex_segments()
-	{
-		// Is the routed segment array different then the main segment array?
-		$diff = (count(array_diff($this->rsegments, $this->segments)) == 0) ? FALSE : TRUE;
-	
-		$i = 1;
-		foreach ($this->segments as $val)
-		{
-			$this->segments[$i++] = $val;
-		}
-		unset($this->segments[0]);
 		
-		if ($diff == FALSE)
-		{
-			$this->rsegments = $this->segments;
-		}
-		else
-		{
-			$i = 1;
-			foreach ($this->rsegments as $val)
-			{
-				$this->rsegments[$i++] = $val;
-			}
-			unset($this->rsegments[0]);
-		}
-	}
-	
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Get the URI String
-	 *
-	 * @access	private
-	 * @return	string
-	 */	
-	function _get_uri_string()
-	{
-		if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
-		{
-			// If the URL has a question mark then it's simplest to just
-			// build the URI string from the zero index of the $_GET array.
-			// This avoids having to deal with $_SERVER variables, which
-			// can be unreliable in some environments
-			if (is_array($_GET) AND count($_GET) == 1)
-			{
-				// Note: Due to a bug in current() that affects some versions
-				// of PHP we can not pass function call directly into it
-				$keys = array_keys($_GET);
-				return current($keys);
-			}
-		
-			// Is there a PATH_INFO variable?
-			// Note: some servers seem to have trouble with getenv() so we'll test it two ways		
-			$path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO');			
-			if ($path != '' AND $path != "/".SELF)
-			{
-				return $path;
-			}
-					
-			// No PATH_INFO?... What about QUERY_STRING?
-			$path =  (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING');	
-			if ($path != '')
-			{
-				return $path;
-			}
-			
-			// No QUERY_STRING?... Maybe the ORIG_PATH_INFO variable exists?
-			$path = (isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : @getenv('ORIG_PATH_INFO');	
-			if ($path != '' AND $path != "/".SELF)
-			{
-				return $path;
-			}
-
-			// We've exhausted all our options...
-			return '';
-		}
-		else
-		{
-			$uri = strtoupper($this->config->item('uri_protocol'));
-			
-			if ($uri == 'REQUEST_URI')
-			{
-				return $this->_parse_request_uri();
-			}
-			
-			return (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri);
-		}
-	}
-
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Parse the REQUEST_URI
-	 *
-	 * Due to the way REQUEST_URI works it usually contains path info
-	 * that makes it unusable as URI data.  We'll trim off the unnecessary
-	 * data, hopefully arriving at a valid URI that we can use.
-	 *
-	 * @access	private
-	 * @return	string
-	 */	
-	function _parse_request_uri()
-	{
-		if ( ! isset($_SERVER['REQUEST_URI']) OR $_SERVER['REQUEST_URI'] == '')
-		{
-			return '';
-		}
-		
-		$request_uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $_SERVER['REQUEST_URI']));
-
-		if ($request_uri == '' OR $request_uri == SELF)
-		{
-			return '';
-		}
-		
-		$fc_path = FCPATH;		
-		if (strpos($request_uri, '?') !== FALSE)
-		{
-			$fc_path .= '?';
-		}
-		
-		$parsed_uri = explode("/", $request_uri);
-				
-		$i = 0;
-		foreach(explode("/", $fc_path) as $segment)
-		{
-			if (isset($parsed_uri[$i]) AND $segment == $parsed_uri[$i])
-			{
-				$i++;
-			}
-		}
-		
-		$parsed_uri = implode("/", array_slice($parsed_uri, $i));
-		
-		if ($parsed_uri != '')
-		{
-			$parsed_uri = '/'.$parsed_uri;
-		}
-
-		return $parsed_uri;
-	}
-
-	// --------------------------------------------------------------------
-	
-	/**
-	 * Filter segments for malicious characters
-	 *
-	 * @access	private
-	 * @param	string
-	 * @return	string
-	 */	
-	function _filter_uri($str)
-	{
-		if ($this->config->item('permitted_uri_chars') != '')
-		{
-			if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
-			{
-				exit('The URI you submitted has disallowed characters.');
-			}
-		}	
-			return $str;
-	}
-	
 	// --------------------------------------------------------------------
 	
 	/**
@@ -431,18 +236,18 @@
 		// There is a default scaffolding trigger, so we'll look just for 1
 		if (count($this->routes) == 1)
 		{
-			$this->_compile_segments($this->segments);
+			$this->_set_request($this->uri->segments);
 			return;
 		}
 
 		// Turn the segment array into a URI string
-		$uri = implode('/', $this->segments);
-		$num = count($this->segments);
+		$uri = implode('/', $this->uri->segments);
+		$num = count($this->uri->segments);
 
 		// Is there a literal match?  If so we're done
 		if (isset($this->routes[$uri]))
 		{
-			$this->_compile_segments(explode('/', $this->routes[$uri]));		
+			$this->_set_request(explode('/', $this->routes[$uri]));		
 			return;
 		}
 				
@@ -461,14 +266,14 @@
 					$val = preg_replace('#^'.$key.'$#', $val, $uri);
 				}
 			
-				$this->_compile_segments(explode('/', $val));		
+				$this->_set_request(explode('/', $val));		
 				return;
 			}
 		}
 		
 		// If we got this far it means we didn't encounter a
 		// matching route so we'll set the site default route
-		$this->_compile_segments($this->segments);
+		$this->_set_request($this->uri->segments);
 	}
 
 	// --------------------------------------------------------------------
